package au.com.acpfg.misc.spectra; import org.knime.core.data.renderer.BitVectorValuePixelRenderer; import org.knime.core.data.renderer.DataValueRenderer; import org.knime.core.data.vector.bitvector.BitVectorValue; import org.knime.core.data.vector.bitvector.DenseBitVector; import org.knime.core.data.vector.bitvector.DenseBitVectorCell; import org.knime.core.data.vector.bitvector.DenseBitVectorCellFactory; public class SpectraBitVectorRenderer extends BitVectorValuePixelRenderer implements DataValueRenderer { /** * distinguishes renderer data when serialized from all others */ private static final long serialVersionUID = 1143519816230556260L; private double m_threshold; private double m_window_left; private double m_window_right; private String m_title; private double m_bin_size = 0.1; /** * Explicit constructor for how the bit vector should be constructed. * @param title Human-readable string to give to the renderer in the table view for the spectra column(s) * @param left m/z where the bit vector is to start * @param right m/z where the bit vector is to stop * @param threshold peaks below this value will be ignored and not displayed in the map >= 0.0 */ public SpectraBitVectorRenderer(String title, double left, double right, double threshold, double bin_size) { m_title = title; assert(left < right && left >= 0.0 && right >= 0.0 && threshold >= 0.0); m_window_left = left; m_window_right = right; m_threshold = threshold; m_bin_size = bin_size; } /** * Displays the iTRAQ 8-plex region of the spectra only */ public SpectraBitVectorRenderer() { // 113.0 == 0.1u to the left of the small iTRAQ peak (8-plex) // 121.2 == 0.1u to the right of the largest iTRAQ peak (8-plex) this("Spectra M/Z map (iTRAQ 8-plex region, bins 0.1u)", 113.0, 121.2, 0.0, 0.1); } /** {@inheritDoc} */ @Override protected void setValue(final Object val) { if (val instanceof BitVectorValue) { super.setValue(val); } else if (val instanceof AbstractSpectraCell) { // compute the bit vector for the super class to render AbstractSpectraCell spectra = (AbstractSpectraCell) val; double[] mz = spectra.getMZ(); double max_mz = m_window_right - m_window_left; int n_bits = (int)(max_mz / m_bin_size)+1; DenseBitVectorCellFactory mybits = new DenseBitVectorCellFactory(n_bits); double[] intensity = spectra.getIntensity(); for (int i=0; i<mz.length; i++) { if (intensity[i] > m_threshold && mz[i] >= m_window_left && mz[i] <= m_window_right) { mybits.set(n_bits - 1 - (int) ((mz[i] - m_window_left) / m_bin_size)); } } super.setValue(mybits.createDataCell()); } } /** {@inheritDoc} */ @Override public String getDescription() { return m_title; } }